# 导入QThread和pyqtSignal
from PyQt5.QtCore import QThread, pyqtSignal
import numpy as np

# 处理图片的公共子线程类
class ImageThread(QThread):
    # 定义一个信号，传递处理后的数组
    sig = pyqtSignal(np.ndarray)

    # 重写构造函数，增加了一个参数，用于传递一个函数指针
    def __init__(self, func, *args, **kwargs):
        super(ImageThread, self).__init__()
        self.func = func
        self.args = args
        self.kwargs = kwargs

    # 重写run函数，用于执行传递进来的函数
    def run(self):
        dst = self.func(*self.args, **self.kwargs)
        # 函数执行完成后，发射信号，传递处理后的数组
        self.sig.emit(dst)


# 处理Sobel算子边缘提取的子线程类
class SobelThread(QThread):
    # 定义一个信号，传递处理后的数组
    sig = pyqtSignal(tuple)

    # 重写构造函数，增加了一个参数，用于传递一个函数指针
    def __init__(self, func, *args, **kwargs):
        super(SobelThread, self).__init__()
        self.func = func
        self.args = args
        self.kwargs = kwargs

    # 重写run函数，用于执行传递进来的函数
    def run(self):
        dst_x, dst_y = self.func(*self.args, **self.kwargs)
        # 函数执行完成后，发射信号，传递处理后的数组
        self.sig.emit((dst_x, dst_y))
